import { defineConfig } from 'vite'
import fs from 'fs'
import path from 'path'

export default defineConfig({
  // ========== 预览服务器配置 ==========

  /**
   * preview - 预览服务器配置
   * 用于预览构建后的生产版本
   * 配置选项与开发服务器类似，但用于生产构建的预览
   */
  preview: {
    // ========== 主机配置 ==========

    /**
     * host - 预览服务器监听的主机
     * 默认: 与 server.host 相同，通常是 'localhost'
     */
    host: 'localhost',
    // host: '0.0.0.0',      // 允许局域网访问
    // host: '192.168.1.100', // 指定特定IP
    // host: true,           // 监听所有地址

    // ========== 允许的主机 ==========

    /**
     * allowedHosts - 允许访问预览服务器的主机名列表
     * 用于生产环境预览的安全控制
     */
    allowedHosts: [
      'localhost',
      '127.0.0.1',
      'preview.example.com',
      'staging.example.com',
      '.example.com'  // 允许所有子域名
    ],
    // allowedHosts: true,  // 允许所有主机（谨慎使用）

    // ========== 端口配置 ==========

    /**
     * port - 预览服务器端口
     * 默认: 4173 (Vite 3+), 之前是 5000
     */
    port: 4173,
    // port: 3000,
    // port: 0,  // 随机可用端口

    /**
     * strictPort - 端口严格模式
     * 设置为 true 时，如果端口被占用则直接退出
     */
    strictPort: false,
    // strictPort: true,  // 端口被占用时报错

    // ========== HTTPS 配置 ==========

    /**
     * https - 启用 HTTPS
     * 预览生产构建时使用 HTTPS
     */
    https: false,
    // https: true,  // 使用自签名证书
    // https: {
    //   // 自定义证书（与生产环境一致）
    //   key: fs.readFileSync(path.resolve(__dirname, 'server-key.pem')),
    //   cert: fs.readFileSync(path.resolve(__dirname, 'server-cert.pem')),
    //   // 或者使用 PFX
    //   // pfx: fs.readFileSync(path.resolve(__dirname, 'server.pfx')),
    //   // pfxPassword: 'your-password'
    // },

    // ========== 自动打开浏览器 ==========

    /**
     * open - 启动预览服务器时自动打开浏览器
     */
    open: false,
    // open: true,  // 打开默认URL
    // open: '/dashboard',  // 打开特定路径
    // open: {
    //   app: {
    //     name: 'firefox',  // 指定浏览器
    //     arguments: ['--private-window']  // 隐私模式
    //   }
    // },

    // ========== 代理配置 ==========

    /**
     * proxy - 预览服务器的代理规则
     * 用于模拟生产环境的 API 调用
     */
    proxy: {
      // 简单代理到后端 API
      '/api': {
        target: 'https://api.production.com',
        changeOrigin: true,
        secure: true,  // 验证 SSL 证书
        headers: {
          'X-Forwarded-Host': 'preview.example.com'
        }
      },

      // 代理到测试环境
      '/test-api': {
        target: 'https://staging-api.example.com',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/test-api/, '/api'),
        configure: (proxy, options) => {
          proxy.on('proxyReq', (proxyReq, req, res) => {
            // 添加测试环境标识
            proxyReq.setHeader('X-Environment', 'preview')
          })
        }
      },

      // WebSocket 代理
      '/ws': {
        target: 'wss://production-ws.example.com',
        ws: true,
        changeOrigin: true
      },

      // 条件代理
      '/conditional': {
        target: 'https://api.example.com',
        bypass: (req, res, proxyOptions) => {
          // 根据条件决定是否代理
          if (req.headers.accept?.includes('text/html')) {
            return false  // 不代理 HTML 请求
          }
        }
      },

      // 多个路径模式
      '^/users/.*': {
        target: 'https://user-service.example.com',
        changeOrigin: true
      }
    },

    // ========== CORS 配置 ==========

    /**
     * cors - 跨源资源共享配置
     * 预览环境通常需要更严格的 CORS 设置
     */
    cors: {
      origin: [
        'https://preview.example.com',
        'https://staging.example.com',
        'http://localhost:4173'
      ],
      methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
      allowedHeaders: [
        'Content-Type',
        'Authorization',
        'X-Requested-With',
        'X-CSRF-Token'
      ],
      exposedHeaders: ['X-RateLimit-Limit', 'X-RateLimit-Remaining'],
      credentials: true,  // 允许携带凭据
      maxAge: 86400,      // 预检请求缓存时间（秒）
      preflightContinue: false
    },
    // cors: true,  // 简单启用
    // cors: false, // 完全禁用

    // ========== 自定义响应头 ==========

    /**
     * headers - 为所有预览响应设置自定义头
     * 用于安全策略、缓存控制等
     */
    headers: {
      // 安全头
      'X-Content-Type-Options': 'nosniff',
      'X-Frame-Options': 'DENY',
      'X-XSS-Protection': '1; mode=block',
      'Strict-Transport-Security': 'max-age=31536000; includeSubDomains',

      // 缓存控制（预览环境通常禁用缓存）
      'Cache-Control': 'no-cache, no-store, must-revalidate',
      'Pragma': 'no-cache',
      'Expires': '0',

      // 自定义头
      'X-Preview-Environment': 'true',
      'X-Application-Version': process.env.npm_package_version || '1.0.0',

      // CSP 内容安全策略
      'Content-Security-Policy': [
        "default-src 'self'",
        "script-src 'self' 'unsafe-inline' https://apis.google.com",
        "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com",
        "font-src 'self' https://fonts.gstatic.com",
        "img-src 'self' data: https:",
        "connect-src 'self' https://api.example.com wss://ws.example.com"
      ].join('; ')
    }
  }
})